package cn.maihe.elg.operation.centers.quanzhou.handler;

import cn.maihe.elg.operation.centers.quanzhou.dto.notice.*;
import cn.maihe.elg.operation.centers.quanzhou.enums.QuanzhouRespCodeEnum;
import cn.maihe.elg.operation.centers.quanzhou.exception.QuanzhouException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * @Description 泉州中心通知接口处理器
 * @Author xxx
 * @Date 2025/08/31
 */
@Slf4j
@RestController
@RequestMapping("/api/quanzhou-finance-sys/noticeapi")
public class QuanzhouNoticeHandler {
    
    /**
     * 支付结果通知接口
     * @param reqDTO 请求参数
     * @return 响应结果
     */
    @PostMapping("/apyresult")
    public QuanzhouNoticeRespDTO payResult(@Valid @RequestBody QuanzhouPayResultNoticeReqDTO reqDTO) {
        log.info("泉州中心支付结果通知接口调用，业务流水号: {}, 状态: {}", reqDTO.getCnewguid(), reqDTO.getState());
        
        try {
            // 验证必填字段
            validatePayResultFields(reqDTO);
            
            // TODO: 处理支付结果通知业务逻辑
            // 1. 根据cnewguid查找对应的业务记录
            // 2. 根据state更新支付状态
            // 3. 如果state=0，更新支付信息（payername, payeraccount, paytime, paymessage, fpremium）
            // 4. 如果state=2，记录拒绝原因
            
            log.info("支付结果通知处理成功，业务流水号: {}", reqDTO.getCnewguid());
            return QuanzhouNoticeRespDTO.success("通知接收成功");
            
        } catch (QuanzhouException e) {
            log.error("支付结果通知处理失败: {}", e.getMessage());
            return QuanzhouNoticeRespDTO.failure(e.getStatus().getMessage());
        } catch (Exception e) {
            log.error("支付结果通知处理异常: {}", e.getMessage(), e);
            return QuanzhouNoticeRespDTO.failure("系统异常");
        }
    }
    
    /**
     * 投保成功通知接口
     * @param reqDTO 请求参数
     * @return 响应结果
     */
    @PostMapping("/applyresult")
    public QuanzhouApplyResultNoticeRespDTO applyResult(@Valid @RequestBody QuanzhouApplyResultNoticeReqDTO reqDTO) {
        log.info("泉州中心投保成功通知接口调用，业务流水号: {}, 保函编号: {}", reqDTO.getCnewguid(), reqDTO.getCpolicyno());
        
        try {
            // TODO: 处理投保成功通知业务逻辑
            // 1. 根据cnewguid查找对应的业务记录
            // 2. 验证保费费率等信息是否一致
            // 3. 更新保函信息（保函编号、文件地址、出函时间等）
            // 4. 更新投保状态为成功
            // 5. 保存相关文件信息
            
            // 模拟验证逻辑
            boolean validationSuccess = validateApplyResult(reqDTO);
            
            if (validationSuccess) {
                log.info("投保成功通知处理成功，业务流水号: {}", reqDTO.getCnewguid());
                return QuanzhouApplyResultNoticeRespDTO.success("检验成功");
            } else {
                log.warn("投保成功通知检验失败，业务流水号: {}", reqDTO.getCnewguid());
                return QuanzhouApplyResultNoticeRespDTO.failure("检验失败", "保费费率校验失败");
            }
            
        } catch (QuanzhouException e) {
            log.error("投保成功通知处理失败: {}", e.getMessage());
            return QuanzhouApplyResultNoticeRespDTO.failure("处理失败", e.getStatus().getMessage());
        } catch (Exception e) {
            log.error("投保成功通知处理异常: {}", e.getMessage(), e);
            return QuanzhouApplyResultNoticeRespDTO.failure("系统异常", "系统处理异常");
        }
    }
    
    /**
     * 退保通知接口
     * @param reqDTO 请求参数
     * @return 响应结果
     */
    @PostMapping("/surrenderresult")
    public QuanzhouNoticeRespDTO surrenderResult(@Valid @RequestBody QuanzhouSurrenderResultNoticeReqDTO reqDTO) {
        log.info("泉州中心退保通知接口调用，业务流水号: {}, 保函编号: {}, 退保状态: {}", 
                reqDTO.getCnewguid(), reqDTO.getCpolicyno(), reqDTO.getTuibaostatus());
        
        try {
            // TODO: 处理退保通知业务逻辑
            // 1. 根据cnewguid和cpolicyno查找对应的保函记录
            // 2. 根据tuibaostatus更新退保状态
            // 3. 如果退保成功，更新保函状态为已退保
            // 4. 如果退保驳回，保持原状态并记录驳回信息
            
            log.info("退保通知处理成功，业务流水号: {}", reqDTO.getCnewguid());
            return QuanzhouNoticeRespDTO.success("退保状态已更新");
            
        } catch (QuanzhouException e) {
            log.error("退保通知处理失败: {}", e.getMessage());
            return QuanzhouNoticeRespDTO.failure(e.getStatus().getMessage());
        } catch (Exception e) {
            log.error("退保通知处理异常: {}", e.getMessage(), e);
            return QuanzhouNoticeRespDTO.failure("系统异常");
        }
    }
    
    /**
     * 理赔通知接口
     * @param reqDTO 请求参数
     * @return 响应结果
     */
    @PostMapping("/claimresult")
    public QuanzhouNoticeRespDTO claimResult(@Valid @RequestBody QuanzhouClaimResultNoticeReqDTO reqDTO) {
        log.info("泉州中心理赔通知接口调用，业务流水号: {}, 保函编号: {}, 理赔状态: {}", 
                reqDTO.getCnewguid(), reqDTO.getCpolicyno(), reqDTO.getLipeistatus());
        
        try {
            // 验证必填字段
            validateClaimResultFields(reqDTO);
            
            // TODO: 处理理赔通知业务逻辑
            // 1. 根据cnewguid和cpolicyno查找对应的理赔记录
            // 2. 根据lipeistatus更新理赔状态
            // 3. 保存理赔相关信息（赔付人、受益人、赔偿金额等）
            // 4. 如果有附件，保存附件信息
            // 5. 如果是拒绝状态，记录拒绝原因
            
            log.info("理赔通知处理成功，业务流水号: {}", reqDTO.getCnewguid());
            return QuanzhouNoticeRespDTO.success("理赔状态已同步");
            
        } catch (QuanzhouException e) {
            log.error("理赔通知处理失败: {}", e.getMessage());
            return QuanzhouNoticeRespDTO.failure(e.getStatus().getMessage());
        } catch (Exception e) {
            log.error("理赔通知处理异常: {}", e.getMessage(), e);
            return QuanzhouNoticeRespDTO.failure("系统异常");
        }
    }
    
    /**
     * 验证支付结果必填字段
     */
    private void validatePayResultFields(QuanzhouPayResultNoticeReqDTO reqDTO) {
        if (reqDTO.getState() == 0) {
            if (reqDTO.getPayername() == null || reqDTO.getPayername().trim().isEmpty()) {
                throw new QuanzhouException(QuanzhouRespCodeEnum.PARAM_ERROR, "支付保费银行账户户名不能为空");
            }
            if (reqDTO.getPayeraccount() == null || reqDTO.getPayeraccount().trim().isEmpty()) {
                throw new QuanzhouException(QuanzhouRespCodeEnum.PARAM_ERROR, "支付保费银行账户号码不能为空");
            }
            if (reqDTO.getPaytime() == null || reqDTO.getPaytime().trim().isEmpty()) {
                throw new QuanzhouException(QuanzhouRespCodeEnum.PARAM_ERROR, "支付时间不能为空");
            }
            if (reqDTO.getFpremium() == null) {
                throw new QuanzhouException(QuanzhouRespCodeEnum.PARAM_ERROR, "保费不能为空");
            }
        } else if (reqDTO.getState() == 2) {
            if (reqDTO.getReason() == null || reqDTO.getReason().trim().isEmpty()) {
                throw new QuanzhouException(QuanzhouRespCodeEnum.PARAM_ERROR, "拒绝原因不能为空");
            }
        }
    }
    
    /**
     * 验证投保成功通知
     */
    private boolean validateApplyResult(QuanzhouApplyResultNoticeReqDTO reqDTO) {
        // TODO: 实现具体的验证逻辑
        // 1. 验证保费费率是否与申请时一致
        // 2. 验证其他关键信息
        return true; // 暂时返回true
    }
    
    /**
     * 验证理赔通知必填字段
     */
    private void validateClaimResultFields(QuanzhouClaimResultNoticeReqDTO reqDTO) {
        if (reqDTO.getLipeistatus() == 3) {
            if (reqDTO.getReason() == null || reqDTO.getReason().trim().isEmpty()) {
                throw new QuanzhouException(QuanzhouRespCodeEnum.PARAM_ERROR, "拒绝原因不能为空");
            }
        }
    }
}